
class PocketCube:
    """
    本次任务是，完善这个二阶魔方类，并通过测试案例。
    测试案例的格式是：输入一段魔方公式，输出魔方在 正面-上面-右面 视角的字符图像。

    详细任务：
        1、实现 PocketCube 的构造函数 ( __init__ )
        2、实现 PocketCube.rotate 方法
        3、实现 PocketCube.show_front_up_right_view 方法
        4、在主程序中执行 测试用例中的魔方公式，并对比输出是否与测试用例一致

    注意事项：
        1、PocketCube类中已经定义了的方法不可以更改，只允许补充函数体。
        2、你可以创造任何其它你需要的类、函数和类属性来帮助你通过测试案例。

    相关资料 - 在线二阶魔方：
        1、https://cube-solver.com/#id=2
        2、https://www.grubiks.com/puzzles/rubiks-mini-cube-2x2x2/
    """

    def __init__(self):
        """
        这个函数 需要 你实现。
        构造函数。
        通过这个函数构造一个抽象的 二阶魔方。
        """

    def rotate(self, direction: str, clockwise=True, times=1) -> None:
        """
        这个函数 需要 你实现。
        旋转是魔方的唯一交互方式。

        该函数有三个参数
        direction：表示一种旋转方式 需要采用以下的0-5进行标号
        clockwise：顺时针时 为 True；逆时针时 为 False
        times：即旋转次数

        名称      公式符号   direction参数
        Front    F         0
        Back     B         1
        Up       U         2
        Down     D         3
        Left     L         4
        Right    R         5

        魔方旋转公式就是上述公式符合合在一起（可以参考 https://www.zhihu.com/tardis/bd/art/610770750?source_id=1001 ）

        """


    def show_front_up_right_view(self) -> str:
        """
        这个函数 需要 你实现。
        用字符展示二阶魔方的 正面-上面-右面 视角
        格式如下:

        魔方一共有六种颜色，用英文首字母表示：
        (W)White
        (R)Red
        (B)Blue
        (G)Green
        (O)Orange
        (Y)Yellow

        ▇ ▇ ▇ ▇ ▇ ▇ ▇         ▇ ▇ ▇ A ▇ ▇ ▇               W                     W
        ▇ ▇ ▇ ▇ ▇ ▇ ▇         ▇ B ▇ ▇ ▇ C ▇           W       W             W  上面  W
        ▇ ▇ ▇ ▇ ▇ ▇ ▇         D ▇ ▇ E ▇ ▇ F         R     W     B         R     W     B
        ▇ ▇ ▇ ▇ ▇ ▇ ▇         ▇ ▇ G ▇ H ▇ ▇             R   B             正面 R   B 右面
        ▇ ▇ ▇ ▇ ▇ ▇ ▇         I ▇ ▇ ▇ ▇ ▇ J         R           B         R           B
        ▇ ▇ ▇ ▇ ▇ ▇ ▇         ▇ ▇ K ▇ L ▇ ▇             R   B                 R   B

        假设一个7*6的网格        找到顶点的位置           用字母块的颜色             很简单吧~
        """

        # 为了方便，模板字符串已经给你准备好了
        template = \
            "      {}      \n  {}       {}  \n{}     {}     {}\n    {}   {}    \n{}           {}\n    {}   {}    \n"

        # 模板字符串用 .format 方法进行填充
        return template.format(
            *list("ABCDEFGHIJKL")
        )

    def act_formula(self, formula: str) -> None:
        """
        这个函数已经写好， 不需要你实现。
        这个函数接收一段魔方公式，解析成旋转方式并执行。
        """

        actions = list("FBUDLR")

        cursor = 0
        prev_config = [None, True, 1]

        try:
            while cursor < len(formula):
                char = formula[cursor]

                if char == "'":
                    prev_config[1] = not prev_config[1]

                if char.isdigit():
                    prev_config[2] = int(char)

                if char in actions:
                    if prev_config[0] is not None:
                        self.rotate(*prev_config)

                    prev_config = [actions.index(char), True, 1]

                if cursor == len(formula) - 1:
                    self.rotate(*prev_config)

                cursor += 1
        except:
            raise Exception("公式错误")


if __name__ == '__main__':
    """
    这里是主程序，在主程序通过魔方公式对二阶魔方进行旋转，然后看与测试案例的结果是否相同。

    输入：一段魔方公式
    输出：show_front_up_right_view方法返回的字符串
    """

    # 实例化你的二阶魔方
    pocketCube = PocketCube()

    # 执行一段魔方公式
    pocketCube.act_formula("UR'2UL'2")

    # 查看魔方结果
    print(pocketCube.show_front_up_right_view())
